import axios, { AxiosInstance, AxiosResponse } from 'axios';
import { Base64 } from 'js-base64';
// import { ElMessage } from "element-plus";
const getPathApi = () => {
    // @ts-ignore
    if (process.env.VITE_API_ENV === 'production') {//生产环境地址
        // @ts-ignore
        return window.gurl?.SERVICE_CONTEXT_PATHAPI || process.env.VITE_API_URL
    }
    // @ts-ignore
    else if (process.env.VITE_API_ENV === 'development') {//开发环境地址
        // @ts-ignore
        return process.env.VITE_API_URL
    } else {//测试环境地址 无process环境
        // @ts-ignore
        return window.gurl?.SERVICE_CONTEXT_PATHAPI || process.env.VITE_API_URL
    }
}
const urls = [

    // http://192.168.0.80:30080
    // http://192.168.12.16:8151
    // http://test-gateway.bdzx.cloud:81/ 外网

    // 连接api json
    // @ts-ignore
    { url: getPathApi(), option: { 'Content-Type': 'application/json' } }, //
    // 连接api formdata
    // @ts-ignore
    { url: getPathApi(), option: { 'Content-Type': 'multipart/form-data' } },
]

export function Req_Encode(parms: any) {
    const formData = new FormData()
    formData.append('data', Base64.encode(JSON.stringify(parms)))
    return formData
}

export const getUrlPrefix = (n = 0) => { return urls[n].url }
export class Request {
    private static axiosInstances: AxiosInstance[] = [];
    public static getReq(address: number) {
        switch (address) {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5: case 6: return this.axiosInstances[address]
            default: return this.axiosInstances[0]
        }
    }

    public static init() {
        // 创建axios实例
        for (const { url, option } of urls) {
            const ai = axios.create({
                baseURL: url,
                timeout: 5000,
                // @ts-ignore
                headers: option,
            });
            // ai.defaults.withCredentials = true
            // 初始化拦截器
            initInterceptors(ai);
            Request.axiosInstances.push(ai)
        }

        return axios;

        function initInterceptors(axiosInstance: AxiosInstance) {
            // 设置post请求头
            // let contentType = 'application/x-www-form-urlencoded';
            // this.axiosInstance.defaults.headers.post["Content-Type"] = contentType;
            /**
             * 请求拦截器
             * 每次请求前，如果存在token则在请求头中携带token
             */
            axiosInstance.interceptors.request.use(
                (config: any) => {
                    // 登录流程控制中，根据本地是否存在token判断用户的登录情况
                    // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
                    // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
                    // const token = useUserInfo().getToken()
                    // if (token && config.headers) {
                    //     config.headers.Authorization = 'Bearer ' + token;
                    // }
                    return config;
                },
                (error: any) => {
                    console.log(error);
                },
            );

            // 响应拦截器
            axiosInstance.interceptors.response.use(
                // 请求成功
                (response: AxiosResponse) => {
                    const headers = response.headers, data = response.data
                    if (headers?.authorization) {
                        localStorage.setItem('userid_token', headers.authorization);
                    } else {
                        if (data?.token) {
                            localStorage.setItem('userid_token', data.token);
                        }
                    }
                    if (response.status !== 200) {
                        errorHandle(response);
                    }
                    return response
                },
                // 请求失败
                (error: any) => {
                    const { response } = error;
                    if (response) {
                        // 请求已发出，但是不在2xx的范围
                        errorHandle(response);
                    } else {
                        // 处理断网的情况
                        // eg:请求超时或断网时，更新state的network状态
                        // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
                        // 关于断网组件中的刷新重新获取数据，会在断网组件中说明
                        // ElMessage.warning('网络连接异常,请稍后再试!');
                    }
                    return response;
                });
        }

        /**
         * http握手错误
         * @param res 响应回调,根据不同响应进行不同操作
         */
        function errorHandle(res: any) {
            // 状态码判断
            switch (res.status) {
                case 401:
                    break;
                case 403:
                    break;
                case 404:
                    // ElMessage.warning('请求失败！');
                    break;
                case 500:
                    // ElMessage.warning('服务器解析错误！');
                    break;
                default:
                    // ElMessage.warning('连接错误！');
                    break;
            }
        }
    }
}